Scott Hanselman helped to highlights the specifics about MEF in his podcast 148 with Glenn Block.
Compared to OSGi, MEF is built upon "Inversion of Control" and OSGi is not: it (OSGi) will discover new bundle through a different mechanism based on a Life Cycle Layer.
MEF is focused on application extensibility. It uses DI as a strategy for composing the different extensions, however it is not in itself a generic DI container.
Since the last point can be confusing, the transcripts of the podcast can help:
The way I basically position it though, the difference between the two, is that IoC containers are really about managing a known set of things in different environments, like I want a logger in my disk environment, I want a mock logger in my test environment.
So MEF is really about managing an unknown set of things and what that boils down to is that in an IoC Container I tend to do either a convention-based or a registration, specific registration mechanism, to say here's what logger means, here's what this means, here's what that means.
MEF uses the code and a discovery mechanism and annotations on the code, which are
attributes, where whatever shows up in the system, that's what's there.
So again, taking it to a higher level, it's about you use MEF to really manage a set of unknown things, you use IoC Containers to manage a set of known things.
Conclusion: (one of) the main difference is the discovery principle (IoC vs. lifecycle)