1. Сделайте два списка: список активных блоков и список неактивных. Когда блок уходит за экран, деактивируйте его и переносите из списка активных в список неактивных, а когда нужен новый блок, делайте наоборот. Для пула неактивных объектов лучше использовать очередь, чтобы "дать остыть" выключенным объектам, не все юнитёвые компоненты дружат с быстрым включением-выключением. Если при включении-выключении есть заметная задержка, то можете заменить его на телепортацию объектов куда-нибудь подальше, где их не видно, либо можете выключать только рендереры и аудио-источники.
2. Можно, просто объявляете тип переменной как List<GameObject>[]
, но, скорее всего, удобнее будет работать с List<List<GameObject>>
. Если и так не удобно, то можете сделать класс-обёртку и будет у вас что-нибудь вроде List<Pool>
.