Using a combination of SparseArray
and Band
after some processing of the diagonal of the input matrix:
ClearAll[toRectangularMatrix]
toRectangularMatrix = Module[{blocks = Replace[Diagonal[#],
{x_?(ArrayDepth @ # == 0 &) :> {{x}}, x_?(ArrayDepth @ # == 1 &) :> {x}}, 1]},
SparseArray[Band[{1, 1}] -> blocks]] &;
Examples:
toRectangularMatrix @ {{a, 0}, {0, {b, c}}} // MatrixForm // TeXForm
$\left(
\begin{array}{ccc}
a & 0 & 0 \\
0 & b & c \\
\end{array}
\right)$
toRectangularMatrix @ {{{b, c}, 0}, {0, a}} // MatrixForm // TeXForm
$\left(
\begin{array}{ccc}
b & c & 0 \\
0 & 0 & a \\
\end{array}
\right)$
toRectangularMatrix @ {{a, 0}, {0, {{b, c}, {d, e}}}} // MatrixForm // TeXForm
$\left(
\begin{array}{ccc}
a & 0 & 0 \\
0 & b & c \\
0 & d & e \\
\end{array}
\right)$
toRectangularMatrix @ {{{a, d, e}, 0}, {0, {b, c}}} // MatrixForm // TeXForm
$\left(
\begin{array}{ccccc}
a & d & e & 0 & 0 \\
0 & 0 & 0 & b & c \\
\end{array}
\right)$
toRectangularMatrix @ {{a, 0, 0}, {0, {b, c, d, e, f}, 0}, {0, 0, {{b, c}, {x, y}}}} //
MatrixForm // TeXForm
$\left(
\begin{array}{cccccccc}
a & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\
0 & b & c & d & e & f & 0 & 0 \\
0 & 0 & 0 & 0 & 0 & 0 & b & c \\
0 & 0 & 0 & 0 & 0 & 0 & x & y \\
\end{array}
\right)$