Try killing all the agents like listener, dbsnmp agent, data gatherer running on the instance if you have. If thats the problem.. work around is create a script that kills all your agents first and tehn use server manager to shutdown database.
Shutdown immediate should kill the agents and bring the database down. Sometimes no where abouts why it bahaves like that. If you can't that way then 'shutdown abort' is the only solution.
If SGA is configured with large memory (> 2GB) , Oracle takes long time to shutdown the instance. The work around is:
1 Issue a check point ( or switch redo log)
2 ALTER SYSTEM FLUSH SHARED_POOL.
3 Ensure that no lock on any table (Query from V$LOCKED_OBJECT view) is held.
4 Kill INACTIVE sessions manually.
5 Issue SHUTDOWN IMMEDIATE or ABORT.
PS. If SHUTDOWN ABORT was used, then bring up instance and then shutdown normal.