Ваши ячейки могут вызвать событие на листе, если они знают о листе. Например:
{
... some code ...
Sheet.RaiseCellChanged(this.CellId);
}
Конечно, тогда каждая ячейка должна иметь способ ссылки на лист, на котором она находится (используя свойство Sheet в приведенном выше примере).
Другой, более грязный вариант - подписка листа на события во всех отдельных ячейках. Это было бы больше работы, но тогда, по крайней мере, Клетки не должны знать о Листе, на котором они находятся.
EDIT:
Чтобы ответить на ваш дополнительный вопрос, с точки зрения производительности не будет никакой разницы. Код было бы легче написать с использованием первого подхода, просто потому, что ваш Лист - или любой другой объект - должен был бы подписаться только на одно событие, чтобы получать данные из любой изменяющейся ячейки (при условии, что это именно то, что вы хотите) .