Premesso che entrare nel tuo (o di chiunque) modo di ragionare non è facile, cmq:
Perchè fai questo ? Per ogni oggetto nel carrello vai a sovrascrivere gender e color con quello che hai passato. gender e color dovresti metterle in $item all'inizio del codice.Codice PHP:
...
for($i=0; $i<count($cart); $i++){
$s += $cart[$i]->price * $cart[$i]->quantity;
$qta = $qta + $cart[$i]->quantity;
$shipping++;
// QUA
$cart[$i]->gender = $_GET['genere'];
$cart[$i]->color = $_GET['colore'];
...
Inoltre, mi sorge un dubbio sul tuo carrello: come differisci le varianti? se non ho capito male una Maglietta uomo blu ha lo stesso id di una Maglietta uomo rossa. Ma tu quando trovi il prodotto nel carrello ($index != -1) incrementi solo la quantità ($cart[$index]->quantity++;)