I'm also a fan of emacs shell and tramp, and use functions like this to start shells on remote boxes without the extra dired/whatever step:
(defun shell-foo()
(interactive)
(let ((default-directory "/ssh:bdarnell@foo:/home/bdarnell/"))
(shell "*shell-foo*")))