Weird. No answers, but some observations:
(1) This form works, but assumes that your matrix is rectangular:
fb[stuff_, base_Integer : 10] := {base, Length@stuff} /; MatrixQ[stuff, IntegerQ]
You didn't explicitly say that it should be rectangular, but your example is. I assume you can replace the condition with a more accurate one for your context. This also "works" without the condition, but then you're losing your constraints on the first argument.
(2) This also "works", but doesn't use your default:
fb[stuff : {{__Integer} ..}, base_Integer] := {base, Length@stuff}
So, it seems very much related to the default value.
(3) It doesn't help to use Default explicitly:
Default[fb] = 10;
fb[stuff : {{___} ...}, base_.] := {base, Length@stuff}
It works for small arguments, and breaks at 4999.
(4) Default values work without the extra pattern stuff:
Default[fb, 1] = {};
Default[fb, 2] = 10;
fb[stuff_., base_.] := {base, Length@stuff}
But again, you lose your other constraints.
(*) My conclusion is that this seems like a bug. But it's fascinating that there is some interaction across the argument patterns. It's also interesting that it breaks at 4999. I don't see how that's related to the recursion limit.