куча одна, а поколений 3, плюс куча для больших объектов, плюс заморочки с финализаторами
Да, финализаторы сразу поколение в памяти меняют, для этого и используют GC.SuppressFinalize(this) чтобы указать что был вызван Dispose и вызов финализатора более не требуется