I think AddRange is better implemented like so:
public void AddRange(IEnumerable<T> collection)
foreach (var i in collection) Items.Add(i);
It saves you a list copy. Also if you want to micro-optimise you could do adds for ..
The datagrid would be bound to a list of objects. If you want
the grid to update when individual object properties change, than each
contained object must implement the INotifyPropertyChanged interface.
The INotifyCollectionChanged is an interface that the collection should
implement, and are for notifications of addition and removal events.