I think you might be asking the wrong question.
Most of the time "proper OOP principles" don't come up during game development. Certainly when writing gameplay code it's both fairly obvious how to divide up things into classes, and not such a big deal to get "encapsulation and all that jazz" 100% perfect.
The "traditional" approach in game development, at it simplest, is to have a base class (eg: GameObject or Actor) with virtual Draw and Update methods. Then a class for each kind of object in your game that inherits from that base class and overrides those methods as appropriate.
Then you simply stick instances of those classes in a list in your game class, which you loop through in Game.Draw and Game.Update calling the respective method on each instance.
You might want to consider adding other methods besides Draw and Update. LoadContent is one good example.
The class DrawableGameComponent is a good example of this architecture (note that it uses the built-in Game.Components as its list). Personally I don't recommend using XNA's component architecture (I advocate a roll-your-own approach). But if you've never seen the Draw/Update thing before it is worth having a look at.
For dealing with your camera object, I recommend making the signature of your draw method look like this:
public virtual void Draw(Camera camera)
That way every game object will be able to access the camera and know how to draw itself. (Note that this is not possible with DrawableGameComponent.)
I strongly recommend having a look at this answer which describes possible game architectures - in increasing complexity. In particular it goes into more detail on the "Actor class" approach and how different actors could interact.