It seems that all the following methods can achieve the goals discussed here:
In[94]:= g[{x__?MatrixQ} | x__?MatrixQ, y : Except[_List] : 0] := {{x}, y}
g[IdentityMatrix[2]]
g[IdentityMatrix[2], b]
g[IdentityMatrix[2], IdentityMatrix[2]]
g[IdentityMatrix[2], IdentityMatrix[2], b]
g[{IdentityMatrix[2], IdentityMatrix[2]}]
g[{IdentityMatrix[2], IdentityMatrix[2]},b]
Out[95]= {{{{1, 0}, {0, 1}}}, 0}
Out[96]= {{{{1, 0}, {0, 1}}}, b}
Out[97]= {{{{1, 0}, {0, 1}}, {{1, 0}, {0, 1}}}, 0}
Out[98]= {{{{1, 0}, {0, 1}}, {{1, 0}, {0, 1}}}, b}
Out[99]= {{{{1, 0}, {0, 1}}, {{1, 0}, {0, 1}}}, 0}
Out[100]= {{{{1, 0}, {0, 1}}, {{1, 0}, {0, 1}}}, b}
In[101]:= g[{x__?MatrixQ} | Longest[x__?MatrixQ], y : Except[_List] : 0] := {{x}, y}
g[IdentityMatrix[2]]
g[IdentityMatrix[2], b]
g[IdentityMatrix[2], IdentityMatrix[2]]
g[IdentityMatrix[2], IdentityMatrix[2], b]
g[{IdentityMatrix[2], IdentityMatrix[2]}]
g[{IdentityMatrix[2], IdentityMatrix[2]},b]
Out[102]= {{{{1, 0}, {0, 1}}}, 0}
Out[103]= {{{{1, 0}, {0, 1}}}, b}
Out[104]= {{{{1, 0}, {0, 1}}, {{1, 0}, {0, 1}}}, 0}
Out[105]= {{{{1, 0}, {0, 1}}, {{1, 0}, {0, 1}}}, b}
Out[106]= {{{{1, 0}, {0, 1}}, {{1, 0}, {0, 1}}}, 0}
Out[107]= {{{{1, 0}, {0, 1}}, {{1, 0}, {0, 1}}}, b}
In[108]:= g[{x__?MatrixQ} | Longest[x__?MatrixQ], y : 0] := {{x}, y}
g[IdentityMatrix[2]]
g[IdentityMatrix[2], b]
g[IdentityMatrix[2], IdentityMatrix[2]]
g[IdentityMatrix[2], IdentityMatrix[2], b]
g[{IdentityMatrix[2], IdentityMatrix[2]}]
g[{IdentityMatrix[2], IdentityMatrix[2]},b]
Out[109]= {{{{1, 0}, {0, 1}}}, 0}
Out[110]= {{{{1, 0}, {0, 1}}}, b}
Out[111]= {{{{1, 0}, {0, 1}}, {{1, 0}, {0, 1}}}, 0}
Out[112]= {{{{1, 0}, {0, 1}}, {{1, 0}, {0, 1}}}, b}
Out[113]= {{{{1, 0}, {0, 1}}, {{1, 0}, {0, 1}}}, 0}
Out[114]= {{{{1, 0}, {0, 1}}, {{1, 0}, {0, 1}}}, b}
So, I'm still not sure if I should use Longest and Except at the same time here.