My approach on nested properties that bind to XAML
To me it looks fine. If you can or will not modify the model objects (Product) by letting them implement INotifyPropertyChanged then this approach is the price to pay for using XAML. In larger projects, it can be a little annoying to seemingly write the same thing twice, but you on the other hand have a true separation of concerns, and your solution is an implementation of the MVVM-pattern.
To me ProductVM is an OK name, I always name my view objects that way.

Instead of using string literals in the call to NotifyPropertyChanged you can use nameof(&lt;property name&gt;):
               NotifyPropertyChanged(nameof(Name));

this will make it easier to maintain, if the property name changes.

   Another approach is to define `NotifyPropertyChanged` as:

  private void NotifyPropertyChanged([CallerMemberName] string name = &quot;&quot;)
  {
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
  }

then you don't need to provide the property name in the call:
    public String Name 
    { 
        get { return _p.Name; }
        set
        {
            _p.Name = value;
            NotifyPropertyChanged();
        }
    }

CallerMemberName requires a reference to System.Runtime.CompilerServices.