На вашем месте я бы реализовал IList в Parent, используя агрегированный типизированный List, но подписываясь на дочерние события в IList.Add и отменив подписку на Remove. Примерно так (извините за синтаксис C #).
class Child
{
public event EventHandler MyEvent;
}
class Parent : IList<Child>
{
List<Child> _list;
// IList implementation
// ...
public void Add(Child item)
{
item.MyEvent += _ParentChildEventHandler;
_list.Add(item);
}
public void Remove(Child item)
{
item.MyEvent -= _ParentChildEventHandker;
_list.Remove(item);
}
void _ParentChildEventHandler(object sender, EventArgs e)
{
Child child = (Child)sender;
// write your event handling code here
}
}