How to use LabelFor on a strongly typed view for a list

Try with some like

@(Html.LabelFor<User, string>(model => model.FirstOrDefault().Name))

Your view model is not adapted to what you are trying to achieve. Here's how a better view model would look like:

public class MyViewModel
{
    // This property represents the header value
    // you could use data annotations to localize it
    [Display(.. some localization here ..)]
    public string NameHeader { get; set; }

    // This property represents the data source that 
    // will be used to build the table
    public IEnumerable<User> Users { get; set; }
}

and then:

@model MyViewModel
<table>
    <tr>
        <th>
            @Html.LabelFor(x => x.NameHeader)
        </th>
    </tr>

    @foreach (var item in Model.Users) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
    </tr>
</table>

and with a display template you don't even need to write a foreach loop:

@model MyViewModel
<table>
    <tr>
        <th>
            @Html.LabelFor(x => x.NameHeader)
        </th>
    </tr>
    @Html.DisplayFor(x => x.Users)
</table>

and inside the custom display template (~/Views/Shared/DisplayTemplates/User.cshtml):

@model User
<tr>
    <td>@Html.DisplayFor(x => x.Name)</td>
</tr>