I'd like to note that above example is actually a very simple approach and could only serve as a learning platform for actual implementation of this highly useful interface.
One major problem I have had while implementing it is with deriving from a CollectionBase class. Even though it is a useful class to save code and time, it already internally implements several interfaces that you cannot therefore fully utilize. For example, it implements Add/Remove methods of IList, so your own Add/Remove logic cannot be part of the interface - instead, any call made from the interface itself, as in code bellow:
((IBindingList)myList).Add();
Would actually call an IList implementation of your CollectionBase class, for example:
myList.List.Add();
This prevents you from controlling add/remove (and few more) methods, but you can use notification overrides which still just serve to notify and cannot prevent anyone from adding or removing items from your collection. Ultimately, actually trying to implement the Add method from IList would result in stack overflow if you use CollectionBase.