For the purposes of this answer, I will name the data types of business object classes.
In my personal experience, view models are always tied to data types. You must have the properties of the types you want to map, so there will always be a link from the namespace of the view models to the namespace of the data types.
What you call a model (from your description in your comment) is similar to my view models. My view models have properties, mostly data type types, and methods, while my data type classes just contain properties for the most part ... they just own data and change reporters.
You seem to have the impression that the INotifyPropertyChanged interface fulfills some responsibilities between the "model", as you call it, and the classes of the view model ... in my opinion, this is not necessary at best ... from the INotifyPropertyChanged Interface on MSDN:
The INotifyPropertyChanged interface is used to notify clients, usually binding clients, that the value of a property has changed.
Therefore, I see the INotifyPropertyChanged interface as a "life blood" that goes between views and view models and data objects. Some developers prefer to โwrapโ each data type in their own view model, but I prefer to implement the INotifyPropertyChanged interface INotifyPropertyChanged in my data types.
The main reason I do this is because I can connect to this structure in the custom sets of classes that I have. This allows me to have collections that are aware of any changes made to a property in any element in the collection, among other things. It also allows me to sync data to my base classes so that objects know when they have any changes.
It also saves time when creating matching class classes for each data type class. Why do two classes do what can be done? I never need this level of separation. If I understand you correctly, the implementation of this interface in your data type types will lead to a denial of the need to fulfill your point a).
Some of your b) and c) points can also be invalidated if you can use .NET 4.5, because there is a new CallerMemberNameAttribute attribute that you can use to automatically provide the name of each property to the PropertyChanged handler. I found a good article called C # 5 - creating INotifyPropertyChanged Easy with a good description about this.
I have written several large-scale WPF applications and several frameworks, and I have never had a problem implementing the INotifyPropertyChanged interface in my data type classes. Actually, I donโt think I could write them at the same time if I had to implement shell model classes for each data type class. This method has served me well so far, and I plan to stick with it until I find a better way, at least. However, this is just one developerโs opinion, and you need to go with what suits you.