If there’s one thing I never want to see in code, then it has to be deeply nested loops. To avoid that, here’s a piece of code that can increment an arbitrary amount of variables without resorting to deep nesting:

The implementation of ArraysEqual can be found here.
The cloning at line 10 occurs to protect the seed in case it’s the same array as mins - there’s no reason why users shouldn’t be allowed to use the same array for both.
Using this method is quite simple, really:

var mins = new[] { 0, 1, 2 };
var maxs = new[] { 5, 5, 5 };
var seed = new[] { 2, 2, 2 };
var root = Increments(mins, maxs, seed);

root is now an enumerable with {2, 2, 2} as the first value and {5, 5, 5} as the last.
There are faster ways to check if the last value has been reached. The first that comes to mind is to compare the sum of maxs with the sum of seed. Better yet, we could sum the seed at the beginning, and just plus-plus it until we are finished.
I like this code because it makes it easy to interrupt our calculations and pick them up at a later time. And the nesting is minimal.