How to remove duplicated code? AOP and Generics are Ok
I assume you really need to distinguish Circle and Triangle.
Any way you can use auto-properties of base class.

public abstract class BaseItem
{
    public int Id { get; set; }
    public string Description { get; set; }
}

public sealed class TriangleItem : BaseItem
{
    // Another TriangleItem class members
}

public sealed class CircleItem : BaseItem
{
    // Another CircleItem class members
}


Boxing mehtods differ in type of object they return, which is subtype of BaseBox though.
That means you can merge them and delegate particular boxes creation to subclasses.

public abstract class BaseBox
{
    public string ItemsXml { get; set; }
    public string Descriptions { get; set; }

    public BaseBox Boxing(BaseItem[] items)
    {
        var ids = items.ToList().Select(i =&gt; i.Id.ToString()).ToArray();
        var descriptions = items.ToList().Select(i =&gt; i.Description.ToString()).ToArray();
        var box = CreateBox(Util.ToXml(ids), descriptions.Aggregate((d, next) =&gt; next + ", " + d));
        return box;
    }

    public BaseItem[] Unboxing()
    {
        return Util.FromXml(ItemsXml).Select(i =&gt; CreateItem(int.Parse(i), i)).ToArray();
    }

    protected abstract BaseBox CreateBox(string itemsXml, string descriptions);

    protected abstract BaseItem CreateItem(int id, string description);
}


The same can be done for unboxing and BaseItem.

public sealed class TriangleBox : BaseBox
{
    protected override BaseBox CreateBox(string itemsXml, string descriptions)
    {
        return new TriangleBox { ItemsXml = itemsXml, Descriptions = descriptions };
    }

    protected override BaseItem CreateItem(int id, string description)
    {
        return new TriangleItem { Id = id, Description = description };
    }
}

public sealed class CircleBox : BaseBox
{
    protected override BaseBox CreateBox(string itemsXml, string descriptions)
    {
        return new CircleBox { ItemsXml = itemsXml, Descriptions = descriptions };
    }

    protected override BaseItem CreateItem(int id, string description)
    {
        return new CircleItem { Id = id, Description = description };
    }
}


Update:
Boxing method should be void. And probably renamed to 'DoBoxing'.

public abstract class BaseBox
{
    ...

    public void Boxing(BaseItem[] items)
    {
        var ids = items.ToList().Select(i =&gt; i.Id.ToString()).ToArray();
        var descriptions = items.ToList().Select(i =&gt; i.Description.ToString()).ToArray();
        this.ItemsXml = Util.ToXml(ids);
        this.Descriptions = descriptions.Aggregate((d, next) =&gt; next + ", " + d);
    }

    ...
}


And called as:

    public BaseBox Do(BaseItem[] items)
    {
        ...

        if (result != null)
        {
            result.Boxing(items);
        }

        return result;
    }