Can't help myself giving a late answer to this question, as I just dealt with a similar thing.
Basically, you could define your own subset of their interfaces to be used via late binding only, here's how:
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] // late binding only
[Guid("00020400-0000-0000-C000-000000000046")] // IDispatch's GUID
interface IMyLateBindingAdaptor
{
// a subset of IWebBrowser2 [http://msdn.microsoft.com/en-us/library/aa752127(v=vs.85).aspx]
string LocationURL { get; }
void Navigate(string url, ref object flags, ref object TargetFrameName, ref object PostData, ref object Headers);
}
Make sure the names and signatures of the defined properties and method match the specification from your vendor.
Using it:
var adaptor = this.webBrowser1.ActiveXInstance as IMyLateBindingAdaptor;
if (null == adaptor)
throw new ApplicationException("No late binding.");
object missing = Type.Missing; // VT_EMPTY
adaptor.Navigate("http://www.example.com", ref missing, ref missing, ref missing, ref missing);
MessageBox.Show(adaptor.LocationURL);
In my opinion, it's better than dynamics as it gives you compile-time type safety (sort of) and IntelliSense.