PostgreSQL also supports indexing the results of a function:
CREATE INDEX mytable_lower_col1_idx ON mytable (lower(col1));
The only other option I can think of is to de-normalize your data a bit by creating another column to hold the upper-case version (updated by triggers) and index that. Blech!