IReadOnlyCollection with notifications
It seems good but I have some comments on this,


Why do you create a new ListItem in every property change and not just replace to old property with the new one?

_list[index].Property1 = property1;

You raise the event without null check. Do this:

var listChanged = ListChanged;
if (listChanged != null)
    listChanged(this,new ListChangedEventArgs(ListChangedType.ItemChanged, index));

As a side note, if Property1 or Property2 are complex objects, It's recommended to create for them you own equal methods (Equal, GetHashCode, == and !=). If the are generic, implement IEquatable&lt;T&gt;