(I know this is an old, ignored thread, but I'm adding this anyway)
The Mono project isn't even trying to solve the same problem (if they were, they wouldn't be moving away from Winelib as the basis of their S.W.F implementation). Their goal is to run portable (pure) .NET apps (either ASP.NET or System.Windows.Forms), not every app that runs on Windows and uses .NET. Mono does P/Invoke, but that's only one of three widely used native/managed interfaces.
Microsoft's tools let developers build managed C++ objects that contain pointers to native C++ objects and can do direct function calls on them (the tools transparently provide the native/managed bridge code). The resulting mixed-mode assemblies won't run in Mono, and there's no reason to think the Mono drivers will make this a goal anytime soon.
I don't think Mono does COM interop either; the last I checked, Mono could neither consume a COM object nor expose a managed object as a COM object, and Windows apps would need both (many Windows APIs are based on COM).