There's a lot of answers on why people use ViewModels. The most straightforward reason is usually the data your views require is different than the data in your business models. For example:
Let's say your application allows a user to upload an image that then gets saved to some cloud storage like Azure Blob Storage. Files stored in blob storage are accessible via a URL of the form: https://account.blob.core.windows.net/filename.png
Your database model might look something like:
public class Image
{
public int Id { get; set; }
public string FileName { get; set; }
}
Here, you're saving the file name of the image. It would be a waste of space to save the full URL, plus it would make moving the data to some other location very difficult.
When it comes to displaying the image however, your view needs that full URL. This is where ViewModel's become useful. (See the note below about how to avoid hard coding URL's in ViewModels).
public class ImageViewModel
{
public int Id { get; set; }
public string FileName { get; set; }
public string Url
{
get { return "https://account.blob.core.windows.net/" + FileName; }
}
}
By passing this to the View, it now has everything it needs to correctly show this image:
<h3>@Model.FileName</h3>
<img src="@Model.Url" alt="@Model.FileName"/>
If you ever move your storage provider, say to Amazon S3 (https://account.s3.amazonaws.com/filename.png), you only need to update the URL in a single place, and your Views are completely unaffected
As a side note, you might want to look at AutoMapper as a way to simplify things even further, and avoid hard coding URL's in your ViewModels. AutoMapper lets you define rules for mapping Models -> ViewModels, including setting default values, flattening objects, etc.