Is this correct usage of the "Decorator" Pattern?
I think you've misunderstood what decorator pattern is.  As described in Wikipedia

"In object-oriented programming, the decorator pattern is a design pattern that allows behavior to be added to an individual object, either statically or dynamically, without affecting the behavior of other objects from the same class."

What you are doing is simple inheritance.

You can do this with an interface, but you don't have too.  You have to ask yourself the question "Do I need to use the Product class?"  If you do, then leave it as is, if you don't, make it an interface, or mark it abstract.

I'm going to assume you need it.

Your class definition looks the same:

public class Product
{
    public virtual string ProductName { get; set; }
    public virtual Decimal Price { get; set; }
    public virtual string ImageUrl { get; set; }

    public virtual string GetImageUrl()
    {
        return ImageUrl;
    }
}


You would then inherit from this class for any other class you need:

public class FooProduct : Product
{
    //we want to serve the image through a cdn
    public override string GetImageUrl()
    {
        return string.Format("cnd.network.com?url={0}", HttpUtility.HtmlEncode(ImageUrl)); 
    }
}


You can now use either class as required:

var productInstance = new Product();

var fooProductInstance = new FooProduct();


The nice part is, you can now pass FooProduct in anywhere a Product is expected:

public void DoSomethingWithProduct(Product product)
{
    // Do some processing
}


Can be called:

processor.DoSomethingWithProduct(product);


or

processor.DoSomethingWithProduct(fooProduct);