I like Peter's idea of using .NET remoting. You could have each client pass a reference to a delegate to the server. The server would add each reference to its event (internally, it's a linked list). When a change takes place, the server fires the event, and all the delegates get called.
A couple of issues:
* firewall: you can configure .NET remoting to use an arbitrary port. This would allow an admin to open an arbitrary port on the firewall. This is far superior to DCOM, which requires that an admin open specific ports which leave gaping holes in security infrastructure.
* timeout/error handling: the server will call each delegate in turn when the event is fired. Be sure to use exception-handling to prevent conditions on one machine from stopping the propagation of the event to all delegates. Also, configure a short-enough timeout on the remoting connections so that temporary problems in one network segment do not prevent the traversal of the delegate list by the server.