I also created a similair approach. The idea was to have the game (or game components) in seppareted DLL's.
On the client side I create a base class that inherids from a interface. This way the engine controls the behavior of each class. It actually works very nice and well.

When creating a game yhe only thing I need to do is create the classes, inherid from an interface (or base class that inherids that interface) and I can access all other object trough that class.

Disadvantage is that I created some overhead for performance.