If we know that

 1. `tuples` is constructed from `ngrids` *grid*s, and
 2. each grid has at least one unique element

then, we can extract the lengths using:

    extractGridLengths = 
      Map[l |-> Total @ Normalize[#, Min] & @ Counts[#[[All, l]]]] @ Range @ #2 &;

    ngrids = 3;

    extractGridLengths[tuples, ngrids]
>     {6, 6, 5}



Then, we can use a combination of `ArrayReshape` and `Extract` to get the *grid*s:

    extractGridPositions = 
      Extract @ 
      Map[m |-> {Splice @ ReplacePart[Table[1, #], {m} -> All], m}] @
      Range[#] &;

    extractGrids = extractGridPositions[#2] @
        ArrayReshape[#, 
         Append[Length @ First @ #]@ extractGridLengths[#, #2]] &;
    
    extractGrids[tuples, ngrids] == {grid1, grid2, grid3}
>     True


***Another example***:



    SeedRandom[1];

    numberOfGrids = RandomInteger[{2, 9}]
>     8

    randomGridLength := RandomInteger[{1, 8}]

    randomGrids = Table[RandomInteger[100, randomGridLength], numberOfGrids]
>     {{40, 7, 0, 33, 65},   
>      {7, 16, 95, 7, 98, 19, 22, 40},   
>      {1, 25, 22, 84},   
>      {12, 2, 61, 84, 96, 50, 89, 19},   
>      {40, 87, 5, 72, 67, 40},   
>      {10, 86, 76, 43, 33},   
>      {53, 18, 49},   
>      {79, 8, 91, 2, 22, 67, 21}}

    Map[Length] @ randomGrids
>    {5, 8, 4, 8, 6, 5, 3, 7}

    paddingLength = 3;

    randomPadding = 
      RandomReal[{1, 2}, {Times @@ Map[Length]@randomGrids, paddingLength}];

    randomTuples = Join[Tuples@randomGrids, randomPadding, 2];

    
    randomTuples // RandomSample[#, 10] & // Column

[![enter image description here][1]][1]

    extractGridLengths[randomTuples, numberOfGrids]
>     {5, 8, 4, 8, 6, 5, 3, 7}
    
    extractGrids[randomTuples, numberOfGrids] == randomGrids
>      True


  [1]: https://i.sstatic.net/lT8eR.png