You'll be wasting a lot of time if you duplicate every property. Instead of doing that, just duplicate the class that contains the properties. In this way, you could do something like this:
Define a class for each row of the Grid
(for display purposes):
public class PropertyGridRow : INotifyPropertyChanged
{
public string PropertyName { get; set; }
public object PropertyValueBefore { get; set; }
public object PropertyValueAfter { get; set; }
}
Then you could fill it like this, or slightly differently in a loop:
Person before = GetBeforePerson();
Person after = GetAfterPerson();
...
PropertyGridRow propertyGridRow = new PropertyGridRow();
propertyGridRow.PropertyName = "Some Property";
propertyGridRow.PropertyValueBefore = before.SomeProperty;
propertyGridRow.PropertyValueAfter = after.SomeProperty;
PropertyGridRows.Add(propertyGridRow);
Then display it like this:
<GridView ItemsSource="{Binding PropertyGridRows}" ... />