I found if you used GetIUnknownForObject and then queried for the IDispatch interface, mono returned E_NOINTERFACE. Maybe this is a bug with mono.
If that's true, using IDispatch instead of IUnknown is probably not an acceptable work-around, as we don't know how that works when a class explicitly implements a non-IDispatch interface that the caller requests. It sounds like a mono bug to me, but it needs a testcase.