Q:

Implementação de Carrinho de Compras em ASP.NET MVC

Estou tentando montar um "simples" sistema de venda, porém, não possuo conhecimento nenhum em e-commerce. O que eu desejo é o seguinte: 
O usuário escolhe os produtos que ele deseja, monta um carrinho, e finaliza o pedido. Aí começa a minha dúvida: o carrinho está meio pronto, eu consigo adicionar os itens e a quantidade desejada, mas não sei como fazer o cálculo para exibir o valor total.
Segue minha Action:
public ActionResult AdicionarCarrinho(int id)
        {
            List<ItemDesign> carrinho = Session["Carrinho"] != null ? (List<ItemDesign>)Session["Carrinho"] : new List<ItemDesign>();

            Design d = db.Design.Find(id);

            if (d != null)
            {
                ItemDesign i = new ItemDesign();
                i.Design = d;
                i.Qtd = 1;
                i.IdDesign = d.IdDesign;

                if (carrinho.Where(x => x.IdDesign == d.IdDesign).FirstOrDefault() != null)
                {
                    carrinho.Where(x => x.IdDesign == d.IdDesign).FirstOrDefault().Qtd += 1;
                }

                else
                {
                    carrinho.Add(i);

                }
                Session["Carrinho"] = carrinho;

            }

            return RedirectToAction("Carrinho");

        }

public ActionResult Carrinho()
    {
        List<ItemDesign> carrinho = Session["Carrinho"] != null ? (List<ItemDesign>)Session["Carrinho"] : new List<ItemDesign>();

        return View(carrinho);
    }

Minha primeira dúvida é: Como posso fazer para fazer o cálculo de valor total de acordo com os ítens do carrinho?
Segunda dúvida: O que fazer após finalizar o carrinho? O que eu estava tentando fazer era mais ou menos o seguinte: 
O usuario finaliza o pedido, e abre uma tela de pagamento (apenas boleto). Ele digitaria os dados dele (nome e cpf, sei lá) e o sistema geraria um "pseudo-boleto" com os dados do comprador e os itens que ele pediu. Não precisa ser um boleto de verdade, pois não pretendo implementar isso realmente.
Seguem minhas tabelas:
Design:
IdDesign
Servico
Preco

ItemDesign:
Id
IdDesign
IdPedido

Pedido:
IdPedido
DtPedido
StatusPedido
IdUsuario
DtPagamento
ValorTotal

Aceito sugestão de qualquer tutorial/livro sobre E-commerce.
Edit:
View do Carrinho
@model List<AllFiction.Models.ItemDesign>     

@{
    ViewBag.Title = "Carrinho";
}

<h2>Carrinho</h2>

    @foreach (var item in Model)

    {

    <li>
        @item.IdDesign - @item.Design.Servico

        <input type="text" value="@item.Qtd" readonly="readonly"/>
        <input type="submit" value="alterar" />
        @Html.ActionLink("Remover", "Remover", "Shop", new {id=item.IdDesign}, null)
    </li>   

    }
@Html.ActionLink("Retornar", "Servicos", "Shop")

A:

Estou supondo que seus Models sejam assim:
public class Design 
{
    [Key]
    public int DesignId { get; set; }
    public String Servico { get; set; }
    public Decimal Preco { get; set; }

    public virtual ICollection<ItemDesign> ItensDesign { get; set; }
}

public class ItemDesign 
{
    [Key]
    public int ItemDesignId { get; set; }
    public int DesignId { get; set; }
    public int PedidoId { get; set; }

    public virtual Design Design { get; set; }
    public virtual Pedido Pedido { get; set; }
}

public class Pedido 
{
    [Key]
    public int PedidoId { get; set; }
    public int UsuarioId { get; set; }
    public DateTime DtPedido { get; set; }
    public StatusPedido StatusPedido { get; set; } // StatusPedido seria um Enum

    public DateTime DtPagamento { get; set; }
    public Decimal ValorTotal { get; set; }

    public virtual Usuario Usuario { get; set; }
    public virtual ICollection<ItemDesign> ItensDesign { get; set; }
}

Não tem muito segredo. Você fez tudo certo até agora. Só vou mudar algumas coisas pra facilitar o cálculo:
    public ActionResult AdicionarCarrinho(int id)
    {
        // Ao invés de colocar uma lista de ítens de Design, vamos colocar
        // Um objeto da entidade Pedido, que já possui List<ItemDesign>.
        // List<ItemDesign> carrinho = Session["Carrinho"] != null ? (List<ItemDesign>)Session["Carrinho"] : new List<ItemDesign>();
        Pedido carrinho = Session["Carrinho"] != null ? (Pedido)Session["Carrinho"] : new Pedido();

        var design = db.Design.Find(id);

        if (design != null)
        {
            var itemDesign = new ItemDesign();
            itemDesign.Design = design;
            itemDesign.Qtd = 1;
            // Esta linha não precisa. O EF é espertinho e preenche pra você.
            // itemDesign.IdDesign = design.IdDesign;

            if (carrinho.ItensDesign.FirstOrDefault(x => x.IdDesign == design.IdDesign) != null)
            {
                carrinho.ItensDesign.FirstOrDefault(x => x.IdDesign == design.IdDesign).Qtd += 1;
            }

            else
            {
                carrinho.ItensDesign.Add(itemDesign);
            }

            // Aqui podemos fazer o cálculo do valor

            carrinho.ValorTotal = carrinho.ItensDesign.Select(i => i.Design).Sum(d => d.Preco);

            Session["Carrinho"] = carrinho;
        }

        return RedirectToAction("Carrinho");
    }

    public ActionResult Carrinho()
    {
        Pedido carrinho = Session["Carrinho"] != null ? (Pedido)Session["Carrinho"] : new Pedido();

        return View(carrinho);
    }

A View ficaria assim:
@model Pedido

@{
    ViewBag.Title = "Carrinho";
}

<h2>Carrinho</h2>

    @foreach (var item in Model.ItensDesign)
    {
        <li>
            @item.IdDesign - @item.Design.Servico

            <input type="text" value="@item.Qtd" readonly="readonly"/>
            <input type="submit" value="alterar" />
            @Html.ActionLink("Remover", "Remover", "Shop", new {id=item.IdDesign}, null)
        </li>
    }

@Html.ActionLink("Retornar", "Servicos", "Shop")

