The reason that a negative times a negative equals a positive is that it is a logical consequence of the basic properties of the integers, which are known as the ring axioms. You can read (way too much) about them here ...
I have to apologize in advance for that link because it's way too technical and fails to provide a simplified introduction to the subject.
But basically we define a "ring" as any mathematical system in which we can add, subtract, and multiply; and that addition and multiplication are related by the distributive law
a(b + c) = ab + ac
valid for all objects a, b, and c, as long as they are members of the system in which we're interested. [From now on I'll use the word "numbers" to refer to the members of our system; but keep in mind that these are not necessarily the familiar integers, but rather the members of any system that obeys these rules.]
The ring axioms say that there's a magic number called 0 that has the property that
0 + n = n for all numbers n
and that for each number n there is an "additive inverse" called -n, whose defining property is that
= n + (-n) = 0.
There's also a magic number called 1 with the property that 1 * n = n for all numbers n.
All these things are true about the everyday integers, so we can use these properties to prove things about the integers. And it turns out to be the distributive property that is crucial.
Here's a formal derivation.
We want to find out what is (-1)(-1).
The way I'm going to do this is to evaluate the quantity (-1)(-1) - 1 and show that it must be zero. This will then prove that (-1)(-1) = 1.
I'll use C++ style comments ('//') to provide hopefully helpful commentary.
(-1)(-1) - 1 // Expression we want to evaluate.
= (-1)(-1) + (-1) // Because "subtraction" is actually adding the additive inverse.
= (-1)(-1) + (-1)(1) // Multiplying something by 1 doesn't change it.
= (-1)(-1 + 1) // This is the distributive law, which says that a(b + c) = ab + ac.
= (-1)(0) // Because -1 + 1 = 0 by definition. -1 is the additive inverse of 1.
= 0 // Anything times zero is zero. That's actually a consequence
// of the ring axioms and requires proof, which which we'll assume.
We just derived a logically certain chain of equality between (-1)(-1) - 1 and 0. If we add 1 to both sides of the equation, we get (-1)(-1) = 1.
Conclusion: The ring axioms logically imply that (-1)(-1) = 1. One is still free to impute metaphysical significance to all this, or to try to "figure it out." Mathematicians prefer abstraction. We write down the properties of the thing being studied; and then we derive logical consequences.
This methodology of abstraction often provides structural insight. We just discovered that the reason a negative times a negative is positive is simply that it's a logical consequence of the distributive law. Once you accept the distributive law, you have no other choice. That's interesting!
By the way we should complete the job by proving the general case (-a)(-b) = ab. That's left to the reader of course