A parte il cast completamente inutile e pericoloso, il problema vero è che stai lavorando su liste diverse, quindi gli iteratori sono diversi.

codice:
std::list<Proprieta*> Struttura::getListaProprieta()
qui restituisci la lista per valore e nel for stai lavorando di fatto su liste diverse.
Ora hai due possibilità:
1) restituisci un puntatore/reference alla lista interna (fortemente sconsigliato)
2) effettui la copia della lista e poi usi quella per ricavare gli iteratori.
codice:
Struttura struttura;
Proprieta *compressione = new Compressione(1);
struttura.addListaProprieta(compressione);
std::list<Proprieta*>::iterator i;

std::list<Proprieta*> prop = struttura.getListaProprieta();

for (i = prop.begin(); i != prop.end(); ++i)
{
    cout << i->getTipo() ;
}