Trivial nitpicking.

I was pretty sure that the convention was to drop the "I" when you implement an interface as a creatable class, so shouldn't your implementation of IFileDialog be FileDialog?

Most Microsoft wrappers and TLBs do this, e.g. see "tom" (Text Object Model), MSXML, and many others.