First, don't use individual pictureboxes - it is not very efficient.
Secondly, why are you doing this:
if (Image.FromFile(imagefile) != null)
{
Image.FromFile(imagefile).Dispose();
}
The if condition reads a file, converts it to a new Image, compares it and then throws away the reference. If it isn't null - which will always be true - it reads it again, creates another new Image and immediately Disposes it.
What do you think that does that is reasonable?
Instead of using PictureBoxes, handle the Paint event for the Panel, and draw the images onto the supplied Graphics object. This will allow you much better control over the placement and size of the images, as well as being considerably quicker.