You need to iterate through data and yield an XElement for each item.
var result = new XElement("captions", data.Select(x => new XElement("caption", x)));
This will generate the result like,
<captions>
<caption>a</caption>
<caption>b</caption>
<caption>c</caption>
</captions>
In your scenarion it assumes, there is a single node
<caption></caption>
with a value of
data.ToList().Select(x => x)