Perhaps create a class to better organize your image data, and then read from it when outputting your markup, e.g.
class MyImage
{
public string Name {get; set;}
public string Url {get; set;}
public List<string> OtherInfo {get; set;}
}
...
public List<MyImage> MyImages = new List<MyImage>();
...
var img = new MyImage {"Name","http://www.example.com"});
img.OtherInfo.Add("Info1");
img.OtherInfo.Add("Info2");
img.OtherInfo.Add("Info3");
string html = "";
foreach(var image in MyImages)
{
// Access image data and write it out. etc.
html+= String.Format("<div>{1}{2}</div>",image.Name, image.Url);
foreach(var info in image.OtherInfo)
{
html+= "<div>" + info + "</div";
}
}
// Write out your code to a literal, placeholder, etc.
MyLiteralControl.Text = html;
You could also achieve writing out the data by first creating your data on the backend, and then simply looping through your list in the actual markup before the page is rendered, e.g.
<html><head></head><body>
<div>My Images</div>
<% foreach(var image in MyImages) { %>
<div><%=image.Name%></div> <!-- format your markup here -->
<% } %>
</body>
</html>
Organizing your data outside of a simple 1-dimensional array will prove to be much more useful in maintaining and debugging your architecture. You can also create business objects to be used across your development, so your code is much more useful and you spend less time rewriting helper objects if the need ever arises to accomplish the same or variant of your logic.