Does the client need to know everything about the server's state? I assume some things happening on the server are unimportant and don't need to be monitored, or are too detailed to monitor completely. So the client will be looking at a summary of the server's state, rather than the full details of everything.
djna's replicated model is a great idea - a separate set of model classes on the server to represent the state that needs to be shared with the client. This would be a simplified summary of the server's complete internal state.
I'm wondering how many different pieces of code on the server make changes that the client needs to know about - changes to the shared model. If changes are coming from many places, could you put a simplified facade on top of the model, to control access to it? So if components A, B, C, and D all need to make changes, they all have to go through the facade. Then you can put the event-tracking logic in the facade, rather than all throughout the model.
If you have to do the tracking in many different classes, you could look into using aspect-oriented programming to automate adding the tracking code to each class. PostSharp is a good tool that can do this by adding code to your .NET assemblies when you compile your app.
Here is a blog post about using PostSharp to automate change tracking using the INotifyPropertyChanged interface. It looks like there's also a PostSharp plugin called PropFu for this.
Since you control the code on both ends (firing and consuming the events), you don't have to use INotifyPropertyChanged - you could define your own interface that's better for your application. But you could use a similar approach.
The change-tracking code could put the events into an in-memory queue on the server. The client could periodically ask the server for the latest events; the server would then check this queue and send all the queued events to the client. (You could also push each event to the client in real time, but that's probably not practical if they're happening really fast.)
When the client connects, the server could send a snapshot to the client as djna described. From then on, the server could keep track of events in its queue. When the client disconnects, the server could stop tracking events, until the client connects again later. When the client reconnects, the server would send another full snapshot, followed by more events.
I've been assuming there's only one instance of the client. If there's more than one, you'd need to separately keep track of which events have been sent to each client, and you would have to keep tracking events as long as at least one client is connected.