I (VincentPovirk) have found the WindowsCodecs metadata system thoroughly inscrutable until today, so I'm writing some notes about it for posterity.
"Metadata" in WIC is accessed as a sort of virtual filesystem corresponding to an individual image frame or image file (probably always a frame in practice). Users access this filesystem using the IWICMetadataQuery(Writer|Reader) interface, which is implemented by windowscodecs.dll.
Decoders/encoders provide the IWICMetadataQuery(Writer|Reader) interface by implementing an IWICMetadataBlock(Writer|Reader) interface and passing that to IWICComponentFactory::CreateQueryReaderFromBlockReader or CreateQueryWriterFromBlockWriter. The IWICMetadataBlock(Writer|Reader) and IWICMetadata(Writer|Reader) interfaces are (normally) invisible to users of WIC. They provide the data structures with a low-level interface, while the IWICMetadataQuery(Writer|Reader) provides a high-level interface.
Decoders are generally not expected to implement the entire metadata hierarchy, just the top level. For each possible container of metadata in the image, the decoder creates a COM object to read it, even if it does not understand the contents of that container. It's always possible that some vendor will extend the format with a custom field and provide a WIC component that can read the container. Decoders use the WICMatchMetadataContent to find the appropriate class to handle unknown data (which may be a generic "unknown" reader). WIC identifies these components using magic numbers in the registry, as described at http://msdn.microsoft.com/en-us/library/ee719795%28v=VS.85%29.aspx#installingregistering
