The specification has the following to say about user-defined operators (emphasis mine)
The following rules apply to all operator declarations:
•An operator declaration shall include both a public and a static modifier.
•The parameter(s) of an operator shall have no modifiers.
•The signature of an operator (§15.10.2, §15.10.3, §15.10.4) shall differ from the signatures of all other operators declared in the same class.
•All types referenced in an operator declaration shall be at least as accessible as the operator itself (§8.5.5).
•It is an error for the same modifier to appear multiple times in an operator declaration.
"Because the spec says so" might not be the most satisfying answer, but it's the best I have. I'm guessing that virtual dispatch doesn't make much sense for operators.
As for your second question, my approach would be to implement a private static method that does your operation, and then have two operator implementations point to it.
Something like this:
public static int operator+(int i, Complex c) => AddInt(c, i);
public static int operator+(Complex c, int i) => AddInt(c, i);
private static int AddInt(Complex c, int i) => c.X + i;