Find tags in text for replacement, my brute force solution
This is a lot of code for such a simple task... but how about some regex:

string text = "Hi [img-2] tst[img-3] test ttteessstt grawr[img-1-800]tet";

var ids = Regex.Matches(
     text, 
     @"\[(?&lt;tag&gt;[a-z]+)-(?&lt;id&gt;\d+)(-(?&lt;width&gt;\d+))?\]",
     RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture
)
.Cast&lt;Match&gt;()
.Select(m =&gt; new ImgReplaceItem
{
    Tag = m.Groups["tag"].Value,
    Id = m.Groups["id"].Value,
    Width = m.Groups["width"].Success ? int.Parse(m.Groups["width"].Value) : 0   
});


result:


Tag Id  Width

img 2   0
img 3   0
img 1   800





As to the code. I think it's well writen. There isn't actually much to correct if anything.

Just a small adjustment: 


if (item.Contains(']'))



You could make it !item.Contains(']') and use the contintue to reduce nesting.