I was looking for the reverse requirement, i needed to convert a 2-dimensions array to an array of arrays. I needed this because json doesn't natively support a serialization of multi-dimensional arrays.
/// <summary>
/// converts a 2 dimensional array to an array of arrays
/// </summary>
/// <typeparam name="T">type of arays</typeparam>
/// <param name="src">2-dimensional array</param>
/// <returns>array of arrays of the same size the <paramref name="src"/></returns>
public static T[][] Convert2DArray<T>(this T[,] src)
{
    // match input
    if (src == null)
        return null;
    // get array dimensions
    var height = src.GetLength(0);
    var width = src.GetLength(1);
    // create the new array
    var tgt = new T[height][];
    for (int i = 0; i < height; i++)
    {
        tgt[i] = new T[width];
        for (int j = 0; j < width; j++)
            tgt[i][j] = src[i, j];
    }
    // return it
    return tgt;
}
Here is a 3 dimensional version:
/// <summary>
/// converts a 3 dimensional array to an array of arrays
/// </summary>
/// <typeparam name="T">type of arays</typeparam>
/// <param name="src">3-dimensional array</param>
/// <returns>array of arrays of the same size the <paramref name="src"/></returns>
public static TDest[][][] Convert3DArray<TSrc, TDest>(this TSrc[,,] src, Func<TSrc, TDest> converter)
{
    // match input
    if (src == null)
        return null;
    if (converter is null)
        throw new ArgumentNullException(nameof(converter));
    // get array dimensions
    var iLen = src.GetLength(0);
    var jLen = src.GetLength(1);
    var kLen = src.GetLength(2);
    // create the new array
    var tgt = new TDest[iLen][][];
    for (int i = 0; i < iLen; i++)
    {
        tgt[i] = new TDest[jLen][];
        for (int j = 0; j < jLen; j++)
        {
            tgt[i][j] = new TDest[kLen];
            for (int k = 0; k < kLen; k++)
                tgt[i][j][k] = converter(src[i, j, k]);
        }
    }
    // return it
    return tgt;
}
And for extra fun, this function can be used to remove a dimension at the same time (3D->2D)
/// <summary>
/// converts a 3 dimensional array to an array of arrays (2D)
/// </summary>
/// <typeparam name="T">type of arays</typeparam>
/// <param name="src">3-dimensional array</param>
/// <param name="converter">a function to convert the 3rd dimension into a new type (e.g. concatenated string)</param>
/// <returns>array of arrays of the same size the <paramref name="src"/></returns>
public static TDest[][] Convert3DTo2DArray<TSrc, TDest>(this TSrc[,,] src, Func<IEnumerable<TSrc>, TDest> converter)
{
    // match input
    if (src == null)
        return null;
    if (converter is null)
        throw new ArgumentNullException(nameof(converter));
    // get array dimensions
    var iLen = src.GetLength(0);
    var jLen = src.GetLength(1);
    var kLen = src.GetLength(2);
    // create the new array
    var tgt = new TDest[iLen][];
    for (int i = 0; i < iLen; i++)
    {
        tgt[i] = new TDest[jLen];
        for (int j = 0; j < jLen; j++)
        {
            tgt[i][j] = converter(GetEnumerableFor3rdDimension(src, i, j, kLen));
        }
    }
    // return it
    return tgt;
}
private static IEnumerable<T> GetEnumerableFor3rdDimension<T>(T[,,] src, int i, int j, int kLen)
{
    for (int k = 0; k < kLen; k++)
        yield return src[i, j, k];
}