Try this code.

The code:
The Ncols
parameter sets the number of columns in the width of the text. The figure was created with Ncols
=3.
First we load the database index
with the file names. They will be displayed in the same order. The file names are irrelevant.
Then we go through all the index entries, opening the named file and loading databases 1
, 2
, 3
, ... and so on, using the [noheader]
option.
To display its content we use an internal loop to create another tabular and insert it in a minipage
with an auto-adjusted width, to be able to insert Ncols
in the width of the text on the page, as a row of the outer tabular.
\documentclass[a4paper]{article}
\usepackage{datatool}
\usepackage{ifthen}% added <<
\usepackage{calculator}% added <<
\newcounter{nrow}
\setcounter{nrow}{1}
\newcounter{Ncols}
\setcounter{Ncols}{3} % set the number of columns in text width <<<<<<<<<<<<<<<<<<<<<<<
\newlength{\Mwidth}
\DIVIDE{1}{\value{Ncols}}{\Wcmd}
\LENGTHSUBTRACT{\Wcmd\textwidth}{1.5em}{\Mwidth}
\begin{document}
\begin{filecontents}{index.csv}
File
ONE.csv
TWO.csv
alpha.csv
beta.csv
gamma.csv
simon.csv
dispa.csv
\end{filecontents}
\begin{filecontents}{ONE.csv}
Header 1
image 1
description 1
xxxx
\end{filecontents}
\begin{filecontents}{TWO.csv}
Header 2
image 2
description 2
\end{filecontents}
\begin{filecontents}{alpha.csv}
Header 3
image 3
description 3
\end{filecontents}
\begin{filecontents}{beta.csv}
Header 4
image 4
description 4
\end{filecontents}
\begin{filecontents}{gamma.csv}
Header 5
image 5
description 5
\end{filecontents}
\begin{filecontents}{simon.csv}
Header 6
image 6
description 6
\end{filecontents}
\begin{filecontents}{dispa.csv}
Header 7
image 7
description 7
\end{filecontents}
\DTLloaddb{index}{index.csv}
\noindent\begin{tabular}{@{}l@{}}
\DTLforeach{index}{\one=File}{%
\DTLloaddb[noheader]{\thenrow}{\one}%
\INTEGERDIVISION{\value{nrow}}{\value{Ncols}}{\sola}{\solb}
\ifthenelse{\solb =1}{\\}{}% Ncols m1nipages per line
\begin{minipage}[t]{\Mwidth}% auto adjusted width
\noindent%
\begin{tabular}[t]{@{}p{\Mwidth}@{}}%
\DTLforeach{\thenrow}{\one=Column1}{\one \\}% display file content
\end{tabular}%
\stepcounter{nrow}%
\end{minipage}\hspace*{2em}%
}
\end{tabular}
\end{document}
Using \setcounter{Ncols}{4}

UPDATE For longer descriptions (1) Write a long line (as #5) or (2) add more lines to the .csv
file (as #1)

Test this code.
\documentclass[a4paper]{article}
\usepackage{datatool}
\usepackage{ifthen}% added <<
\usepackage{calculator}% added <<
\newcounter{nrow}
\setcounter{nrow}{1}
\newcounter{Ncols}
\setcounter{Ncols}{3} % set the number of columns in text width <<<<<<<<<<<<<<<<<<<<<<<
\newlength{\Mwidth}
\DIVIDE{1}{\value{Ncols}}{\Wcmd}
\LENGTHSUBTRACT{\Wcmd\textwidth}{2.2em}{\Mwidth}
\begin{document}
\begin{filecontents}{index.csv}
File
ONE_long.csv
TWO.csv
alpha.csv
beta.csv
gamma_long.csv
simon.csv
dispa.csv
\end{filecontents}
\begin{filecontents}{ONE_long.csv}
Header 1
image 1
description 1a
description 1b
description 1c
\end{filecontents}
\begin{filecontents}{TWO.csv}
Header 2
image 2
description 2
\end{filecontents}
\begin{filecontents}{alpha.csv}
Header 3
image 3
description 3
\end{filecontents}
\begin{filecontents}{beta.csv}
Header 4
image 4
description 4
\end{filecontents}
\begin{filecontents}{gamma_long.csv}
Header 5
image 5
a very long long description 5a
\end{filecontents}
\begin{filecontents}{simon.csv}
Header 6
image 6
description 6
\end{filecontents}
\begin{filecontents}{dispa.csv}
Header 7
image 7
description 7
\end{filecontents}
\DTLloaddb{index}{index.csv}
\section*{Long Descriptions}
\noindent\begin{tabular}{@{}l@{}}
\DTLforeach{index}{\one=File}{%
\DTLloaddb[noheader]{\thenrow}{\one}%
\INTEGERDIVISION{\value{nrow}}{\value{Ncols}}{\sola}{\solb}
\ifthenelse{\solb =1}{\\}{}% Ncols m1nipages per line
\begin{minipage}[t]{\Mwidth}% auto adjusted width
\noindent%
\begin{tabular}[t]{@{}p{\Mwidth}@{}}%
\DTLforeach{\thenrow}{\one=Column1}{\one \\}% display file content
\end{tabular}%
\stepcounter{nrow}%
\end{minipage}\hspace*{2em}%
}
\end{tabular}
\end{document}