Один из способов для делегата - принять аргумент для себя:
delegate void Foo(Foo self);
...
list.Add(delegate (Foo self) { list.Remove(self);});
...
foreach (Foo f in list) f(f);
Другой способ - закрыть переменную, ссылающуюся на себя:
Foo foo;
foo = delegate() { list.Remove(foo);}
list.Add(foo);