単純にショートコードを作って利用すると、生成されたものに意図しない改行タグや空白削除が入いります。これはWPのWYSIWYG(ビジュアルエディタ)が標準で行う整形機能のため仕方がない仕様です。
この整形機能自体を停止するadd_filterがありますが、個人的に手打ちでPbrを入れる手間を考えると、エンターで改行が追加できる機能を外すのは勿体ないので、ショートコード関数内で置換して改行を削除しましょう。

この記事の経緯

ソースコードの装飾がしたい → GOOGLEのシンタックスハイライターJS導入 → preで囲う → テキストエディタに切り替えてclass名いれるのが面倒→ pre自体をSCで作ればいいじゃないか! → 行頭の空白削除されて可読性悪&投稿画面も見づらい → preをSCで囲えばいいじゃないか → 改行が追加され可読性悪。。。

http://codex.wordpress.org/Shortcode_API

wpautop関数の実行直後にショートコードが実行

ぐぐって調べていくうちに以下を知りました。

ショートコードで制御できるかを調べる段階で、wpautop関数の実行直後にショートコードが実行されることがわかった。これまでショートコードの実行タイミングをあまり意識していなかったが、この点は押さえておいたほうがいいだろう。

http://elearn.jp/wpman/column/c20130813_01.html

ショートコードは囲んだ内容を$content変数に代入します。
この時、WPのtinyMCE(リッチエディタ)で整形されpbrが入った状態で代入されるので、これを削除すれば意図どおりの表示になる訳です。
以下のように$contentからp/pbrを削除します。

function mycode($atts, $content = null) {
  $content = preg_replace('/\<p\>|\<\/p\>|\<br \/\>/', '', $content);
  return $content;
}
add_shortcode('code', 'mycode');
functions.php
ソースコード装飾ならGoogle code prettify

これ\nのみが残った状態になります。preで表示すれば\nはそのまま表示されるので、可読性が高いソースコードの装飾ができました。

空白の削除の停止

行頭の空白削除もtinyMCEエディタの機能ですが、ソースコードを表示するときには逆に作用します。
そもそもHTMLには適正があるので、リスト形式やインデントを空白や改行で表現したりってのはご法度、アスキーアートなど行頭の空白を削除させたくない場合はPREを利用します。

シンタックスハイライターはこのPREをJSで装飾するので、SC作成の際、[SC名 lang=’php’]などオプションで送った言語設定をclassに置き換えて戻します。