new をきちんと乗っ取る

上記のコードでは、正常に実行できません。
base.CreateInstance() で手に入ったオブジェクトに対して GetType() を呼び出すと「コンストラクタ呼び出しが進行中にプロキシを呼び出そうとしました。」と怒られて終了してしまいます。
ProxyAttribute のドキュメントにも記載がありますが、この部分は new の処理全体のうち序盤の序盤部分ですので、まだメソッドを呼び出したりすることができない状態のオブジェクトを扱っていることになります。
当然ですが、

public class Form1ProxyAttribute : ProxyAttribute
{
  public override MarshalByRefObject CreateInstance(Type serverType)
  {
    return MethodLogger.Attach( new Form1() );
  }
}

などとしたら、new Form1() が Form1ProxyAttribute.CreateInstance() を呼び出して再帰してしまうので、base.CreateInstance() が利用するオブジェクトを使うしか、選択肢はありません。
ここは MethodLogger のコンストラクタや Attach() を変更して、CreateInstance() の引数である serverType を利用して RealProxy を生成する必要があります。