I'll take a stab at this one, but first from a non-geometric perspective. In probability, we estimate the joint probability of two random events using the following equation:
$p(A\cap B) = p(A)\times p(B)$
We can use this equation to also calculate the deviations from independence:
$\text{observed} - \text{expected under independence} = P(A\cap B) - P(A)\times P(B)$
where $P$ represents the observed probability. (Sorry if my notation is terrible...it's not my forte).
This is exactly what the traditional chi-square test of independence uses, but it replaces probabilities with counts:
expected = row sum $\times$ col sums / table sum
So, with an ANOVA, if your sample sizes are equal in each cell, they will be independent (orthogonal) because row sums $\times$ colsums / table sums will always exactly equal the expected probability as with a chi-square test.
Or, a different way to think about it is this: assuming a random process, it would be highly unusual to have a sample where the number of males/females over 6 feet tall are equal. Why would that be unusual? Because height is NOT independent of gender.
Likewise, for an ANOVA, if we have uncorrelated variables, they should have equal sample sizes. If they're correlated, they should not.
Make sense?
Geometric Explanation
This may be better to "see" than to explain. Let's say we have two factors (a and b) where the sample sizes are the same. The R code below generates the data and plots it. If we plot a against b (or vice versa), the best fitted regression line is exactly flat:
a = c(rep(c(1,2), times=6))
b = c(rep(1, times=6), rep(2, times=6))
d = data.frame(a=a,b=b)
table(a,b) #verify orthogonality
require(ggplot2)
ggplot(data=d, aes(x=a, y=b)) +
geom_jitter(width=.1, height = .1) +
geom_smooth(method="lm") # flat line
If we now allow different sample sizes in each group, there's now a positive slope:
a = c(rep(c(1,2), times=6))
b = c(rep(1, times=3), rep(2, times=9))
d = data.frame(a=a,b=b)
table(a,b) #verify nonorthogonality
ggplot(data=d, aes(x=a, y=b)) +
geom_jitter(width=.1, height = .1) +
geom_smooth(method="lm") # nonflat line