When you shutdown immediate, that tells the database in laymens terms "Hey I want you to shutdown but only after everyone who is presently connected finishes thier job and don't accept any new connections while you're at it"

So, with that said you either have a process that's out there that is not finished and or hanging up or one that might be rolling back in that case you'd want to see if SMON was out there acting a fool. Often times you'll see an entry in the alert log about SMON finsihing up stuff. I can't remember what the entry says off the top of my head.

Just for grins why don't you post the last hundred lines of your alert log from a failed shutdown.