The List<T> class essentially just wraps a T array that is replaced with a larger T array when the array is full. The fastest way to append your byte array to List<byte> would be to copy the bytes directly into the internal byte array.
However, the List<T> class does not expose the internal array, so the best option is probably to ensure that the list has enough capacity and does not need to replace the internal array multiple times, and then add each byte one by one:
bundleData.Capacity += endIndex - startIndex + 1;
for (int i = startIndex; i <= endIndex; i++)
{
bundleData.Add(fileData[i]);
}
You could also experiment with AddRange and providing a view of the byte array:
static IEnumerable<T> Range<T>(this T[] array, int offset, int count)
{
for (int i = 0; i < count; i++)
{
yield return array[offset + i];
}
}
bundleData.AddRange(fileData.Range(startIndex, endIndex - startIndex + 1));