Na początku zdecyduj, co chcesz w tym sklepie mieć. Na pewno produkty, kategorie, koszyk.
Rozplanuj stronę, co gdzie ma być, możesz nawet wydzielić różne elementy na osobne widoki - box koszyka, box z kategoriami/menu, nagłówek, stopka, lista kategorii (także podkategorii), lista produktów w kategorii (różne widoki), wygląd koszyka.
Jeśli orientujesz się, co to kontrolery - utwórz odpowiednie i dodaj do nich wymagane przez Twój plan metody. Oczywiście najlepiej byłoby, gdybyś rozdzielił cześć kliencką i administracyjną.
Jak można napisać taki sklep? Możesz zrobić tak, że pomiędzy koszyk jest obiektem, który posiada metody: dodaj do koszyka, usuń z koszyka, wyczyść koszyk. Przed wrzuceniem do sesji serializujesz. Później, np, w konstruktorze deserializujesz i posiadając ten obiekt generujesz resztę widoków (głównie box z koszykiem).
Dodawanie produktów to już jak Tobie wygodniej, wydaje mi się, że dobrze jest to realizować poprzez linka z określonym id (lub inny sposób, jeśli od razu chcesz określać ilość produktów) /dodaj/1234 .
Nie mam za bardzo pomysłu na atrybuty, ale jeśli potrzebujesz czegoś naprawdę BANALNEGO, możesz zrealizować to przez zwykłego stringa, którego parsujesz i na jego podstawie generujesz dropdown-y/select-y:
kolor:czerwony,niebieski,biały;rozmiar:L,XL,M,XXL,S
Przy bardziej zaawansowanych rozwiązaniach, jak np w sklepach komputerowych relacje między produktami wymagałyby już bardziej zaawansowanego definiowania atrybutów i dodatkowych tabel w bazie danych.