The keyboard events are part of the Form class in System.Windows.Forms. The GameWindow you get when you use the Game class doesn't use WinForms (or maybe it does, it doesn't matter since it's not exposed to you as one) so you don't get the keyboard events.
However I don't see why you think events would be more efficient than polling the keyboard state. It's not like every time you call KeyboardState.IsKeyDown you 're enacting a bunch of keyboard I/O routines or anything...you've already retrieved a snapshot of keyboard state when you call GetState. From that point onward you're basically just retrieving values out of a struct, which is probably just accessing an array. Events on the other hand require calling multiple delegates every time the state of a single key changes...that's not exactly cheap.
If you really want events and you're not working with WinForms, it shouldn't be hard at all to set up something yourself. You can just make a KeyboardInput class, and expose an OnKeyDown and OnKeyUp events. Then just give the class an Update function that you call once a frame, and in that Update function you can check the keyboard state and fire events as needed. The GetPressedKeys method of KeyboardState might be useful for this purpose.
Matt Pettineo | DirectX/XNA MVP
Ride into
The Danger Zone |
PIX With XNA Tutorial