It's very unlikely that you will be able to achieve this without compromising Microsoft's .Net Install. The thing that will get you is that no matter what API you call, whenever the CLR attempts to load a DLL it will always get it from the GAC if a compatible version exists there.
WinForms will implicitly load the System.Data.dll in serveral cases and the CLR will do a GAC check. If you are using the MS version of WinForms this will resolve down to the MS version that is in the GAC. There is no way to break this without modifying the GAC.
Alll MS assemblies are signed with a private key that, AFAIK, mono cannot duplicate. So it seems like there would be no way for you to get your DLL loaded ahead of the built-in GAC DLL and hence no way to replace it.