Parallel.ForEach uses a thread pool, so you can limit the number of threads. If you were processing dozens of files it would not make a difference, but you really don’t want to create 100s or 1000s of threads, or more than actual cpu cores.
List<t> is not concurrency safe. You need to wrap read/write access with locks.