I tried to define a delegate override between Int32 and IntPtr. Why are the following overloads illegal?
public delegate int EnumWi
No, you cannot overload a delegate. Overloads are selected when there is type information available to the compiler to pick one... but with a delegate, you are supplying the type information and the compiler would have no way to select from overloads.
If you want a family of similar delegate types, you can use generics.
public delegate int EnumWindowsCallback(System.IntPtr hWnd, LParamType lParam);
Now you can define overloaded p/invoke signatures which accept different delegate types EnumWindowsCallback, EnumWindowsCallback, etc.