Hmmm. Yeah, that makes life trickier.
Since the base class is effectively a member of the derived class, and since the whole .NET-wrapper-over-native-structs approach is predicated on a fixed memory layout for the structures, you
should be able to do pointer math to turn a CGapiBitmapFont into a CGapiSurface - just write a dummy C++ app that computes the pointer delta; for any given build of GapiDraw this should be fixed. Then, in your .NET wrappers just add the delta to the IntPtr to convert from CGapiBitmapFont to CGapiSurface.
Of course, this is just theory - I haven't written this. When I was doing wrappers I had the luxury of being able to add native stubs in such cases so that the compiler did all of the hard thinking.