Для меня это звучит так, будто вы структурировали задом наперед. Вы не должны хранить элементы, представленные интерфейсом в вашем контроллере. У вас должна быть модель, содержащая ваши элементы, которые ваш контроллер использует для построения представлений вашего интерфейса.
Итак, у вас есть модель, содержащая список продуктов и связанные с ними метаданные. Ваш контроллер запрашивает этот список, создает представление для каждого элемента в нем и добавляет эти представления в иерархию представлений приложения (возможно, в виде прокрутки, как вы предлагаете). Любое взаимодействие с этими представлениями обращается к контроллеру, который затем вносит изменения в модель. Любые изменения в модели должны публиковать уведомление, которое контроллер прослушивает, чтобы он мог соответствующим образом обновить (или просто перезагрузить) свои представленные представления.
Обратите внимание, что при таком расположении один элемент в вашей модели может быть представлен в интерфейсе несколько раз. Скажем, вы представляете список предметов, помеченных как «Гигант», и список предметов, помеченных как «Зеленый». Если бы у вас был продукт «Jolly Green Giant», он был бы представлен в обоих списках. Но поскольку один и тот же элемент в вашей модели является источником для обоих, любые изменения одного автоматически отражаются другим. Как правило, это желаемое поведение (если вы удалили «Jolly Green Giant» из списка «Green», вам также нужно удалить его из списка «Giant»).
Для получения дополнительной информации ознакомьтесь с шаблоном Model View Controller (MVC).