Cómo leer propiedades dinámicas de la base de datos

Trataré de explicar mi escenario de la mejor manera que pueda. Tengo las siguientes tablas en mi base de datos:

Products{ProductId, CategoryId ...}
Categories{CategoryId ...}
CategoryProperties{CategoryPropertyId, CategoryId, Name ...}
PropertyValues{ProductId, CategoryPropertyId, Value ...}

Por lo tanto, el objetivo es tener una lista de productos que pertenezca a alguna categoría y cada categoría puede tener 'n' número de propiedades con valores en la tabla 'PropertyValues'. Tengo una consulta que devuelve datos basados ​​en 'categoryId', por lo que siempre puedo obtener diferentes resultados de la base de datos:

Para la categoría de CPU:

intel i7 | CPU | Model | Socket | L1 Cash | L2 Cahs | etc.

Para la categoría HDD:

samsung F3 | HDD | Model | Speed | GB | etc.

Por lo tanto, en función de las categorías de mi consulta, siempre puedo obtener diferentes números y nombres de columna. Para el acceso a la base de datos, uso una llamada simple de ADO.NET al procedimiento almacenado que devuelve el resultado. Pero como el resultado de la consulta es dinámico en su naturaleza, no sé cuál es una buena manera de leer estos datos.

Hice unaProduct entidad peroEstoy confundido cómo hacerlo realmente :( Pensé que puedo hacer unProduct entidad y hacer otras entidades queheredar Product me gustaCpu, Hdd, Camera, PcCase, GraphicCard, MobilePhone, Gps etc.

pero yo piensoque es estúpido porque puedo terminar esto conMás de 200 entidades en el dominio.

¿Qué haría usted en esta situación?
Cómo leer y dónde poner esto.propiedades dinámicas?

ACTUALIZACIÓN - alguna solución

Todo bien basado en@millimoose sugerencia paraDictionary y@Tim Schmelter idea de usarDataTable Objeto llegué a alguna solución.
Ahora ... esto funciona. Obtengo que los datos los lean y puedo mostrarlos.
Pero todavía necesito consejos de gente más inteligente que yo en¿Lo hice bien? o debo manejar esto mejor o estoy hecho un pococódigo spageti. Así que aquí lo que hice:

public class Product
    {
        public Product()
        {
            this.DynamicProperties = new List<Dictionary<string, string>>();
        }

        public List<Dictionary<string, string>> DynamicProperties { get; set; }

    }
...
List<Product> products = new List<Product>();
...
using (SqlDataAdapter a = new SqlDataAdapter(cmd))
                {
                    DataTable t = new DataTable();
                    a.Fill(t);

                    Product p = null;

                    foreach (DataRow row in t.Rows)
                    {
                        p = new Product();
                        foreach (DataColumn col in t.Columns)
                        {
                            string property = col.ColumnName.ToString();
                            string propertyValue = row[col.ColumnName].ToString();

                            Dictionary<string, string> dictionary = new Dictionary<string, string>();

                            dictionary.Add(property, propertyValue);

                            p.DynamicProperties.Add(dictionary);
                        }

                        products.Add(p);
                    }
                }

Respuestas a la pregunta(2)

Su respuesta a la pregunta