For point number 6, if the match rule for the control is specific to only the instance for the first row, then it will not match on subsequent rows. For example; if the ElementID were something like "downloadLink1" (where 1 is the row number) and you were using that as the match rule, then it would not match on subsequent rows.
For number 7, you would add a check to IsCreated into your table iteration. I've attached the first example I could find, although I am not checking IsCreated, but you can get the point.
For number 6, you need to make the match rule generic enough such that it works for every instance of the link. Basically, identify what is common about the link on each row and make sure that your match rule within your HTML table is setup to match each one.
For item number 7, it sounds like you are not checking to see if the link IsCreated property is True. I believe this will return True or throw an Exception rather than return false. You will want to wrap it in a Try...Catch. You can also right-click it and select "Handle KeyNotFound Exception"
Set the match rule for point number 6 to match anything that is there. I usually use a Inner Text match rule with type of Regex and set the criteria to a dot. Use the contents of the cell then to determine the type - for instance if it ends with .pdf you know it will download a pdf. Based on the type you can then add your handling based on what you expect from that type.