Я ведь и сам не представляю как вы планируете манипулировать этим всем, что откуда вызывать и где что назначать. Я лишь сделал некий пример по вашему условию - добавлять в объект разные свойства и всё.
Абстрактный класс сделал чисто для того, чтобы контролировать методы создания и получения свойств. Чтобы в них нельзя было передать какой-то посторонний класс. Это было просто для красоты (в моём понимании) архитектуры кода. Хотя это совершенно и не обязательно и абстракцию можно убрать на ваше усмотрение.
Ваш последний пример выглядит вполне нормально, если вам удобно им пользоваться. Вот например я не знал, что в каждом свойстве вы планируете некий конкретный метод GeneralMethod, который должен делать что-то особенное. Сложно подсказать, так как я не знаю ваших замыслов